package 每日一题;

/**
 * @description:
 * @author: 小白白
 * @create: 2021-10-04
 **/

public class No405数字转换为十六进制数 {

    /**
     * 给定一个整数，编写一个算法将这个数转换为十六进制数。对于负整数，我们通常使用 补码运算 方法。
     *
     * 注意:
     * 十六进制中所有字母(a-f)都必须是小写。
     * 十六进制字符串中不能包含多余的前导零。如果要转化的数为0，那么以单个字符'0'来表示；对于其他情况，十六进制字符串中的第一个字符将不会是0字符。 
     * 给定的数确保在32位有符号整数范围内。
     * 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
     *
     * 示例 1：
     * 输入:
     * 26
     * 输出:
     * "1a"
     *
     * 示例 2：
     * 输入:
     * -1
     * 输出:
     * "ffffffff"
     */

    /**
     * 核心思想: 16进制等于[4位2进制],所以每次都看低4位能转成16位中的哪个数字。
     * 二进制的低四位可以同 0xf 来&表示, 0x->表示16进制 f->为16。
     * 如果是负数,那么也可照移不误,因为最高位的-1肯定会影响到16位的高位,但是要有个尽头
     * 1. >>>无符号右移动,判断num==0即可
     * 2. >>,因为入参的int,所以结果只能是 [32位/4] = 8, 2进制的int最多只能转成length=8的16进制。
     */

    public String toHex(int num) {

        if (num == 0) {
            return "0";
        }

        String str = "0123456789abcdef";
        StringBuilder ans = new StringBuilder();

        while (num != 0) {
            ans.insert(0, str.charAt((num & 0xf)));
            num >>>= 4;
        }

        return ans.toString();
    }

}
